﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AcessaDadosBD;
using AcessaDadosBD.Repositorios;
using docTissV2.Classes;
using Enumeradores = docTissV2.Enumeradores;
using System.Linq;

namespace docTissV2
{
    public partial class uc_Configuracoes : UserControl
    {
        bool updateConf = false;
        
        Operadora operadoraEntity = new Operadora();
        OperadoraPrestador opPrestadorEntity = new OperadoraPrestador();
        IntervaloLote intervaloLoteEntity = new IntervaloLote();
        Prestador prestadorEntity = new Prestador();

        IntervaloLoteRepository intervaloLote = new IntervaloLoteRepository(AddinUtils.Command);
        OperadoraRepository operadora = new OperadoraRepository(AddinUtils.Command);
        OperadoraPrestadorRepository operadoraPrestador = new OperadoraPrestadorRepository(AddinUtils.Command);
        PrestadorRepository prestador = new PrestadorRepository(AddinUtils.Command);

       public uc_Configuracoes()
        {
            InitializeComponent();
        }

       #region configuracoes
        /// <summary>
        /// Carrega ListView de Operadoras Filiadas ao Prestador Selecionado na guia de Configurações
        /// </summary>
        public void carregaOperadorasFiliadas()
        {
            lvwConfOperadoras.Items.Clear();
            lvwConfOperadoras.Groups.Clear();
            
          var query = from op in operadoraPrestador.GetAll()
                      where op.IDPrestador == AddinUtils.UsuarioID
                        select new
                        {
                            op.CodigoNaOperadora,
                            op.RegistroANS,
                            op.ID,
                        };
           ListViewGroup groupOpFiliadas = new ListViewGroup("Operadoras Filiadas");
           lvwConfOperadoras.Groups.Add(groupOpFiliadas);
                 
              foreach (var opPrestador in query)
            {
                ListViewItem item = new ListViewItem(operadora.GetById(opPrestador.RegistroANS).Nome);
                item.SubItems.Add(opPrestador.RegistroANS);
                item.SubItems.Add(opPrestador.CodigoNaOperadora);
                item.SubItems.Add(opPrestador.ID.ToString());
                groupOpFiliadas.Items.Add(item);
                lvwConfOperadoras.Items.Add(item);
            }

            updateConf = false;
            txtCodOp.Text = "";
            txtLoteMax.Text = "";
            txtLoteMin.Text = "";
            gpbIntervaloLote.Enabled = false;
            gpbCodigo.Enabled = false;
            gpbConfOperadora.Enabled = true;
            dgvIntervaloLote.DataSource = null;
            btnConfGravar.Enabled = true;
            carregaOpNaoFiliadas();
        }

        /// <summary>
        /// Carrega ListView de Operadoras NÃO filiadas ao Prestador Selecionado na guia de Configurações
        /// </summary>
        private void carregaOpNaoFiliadas()
        {
            ListViewGroup groupOpNaoFiliadas = new ListViewGroup("Operadoras Não Filiadas");
            lvwConfOperadoras.Groups.Add(groupOpNaoFiliadas);

            var query1 = from op in operadoraPrestador.GetAll()
                         where op.IDPrestador == AddinUtils.UsuarioID
                         select op.RegistroANS;
                var query2 = from op in operadora.GetAll()
                             where !query1.Any( reg => reg == op.RegistroANS) 
                             select new
                             {
                                 op.RegistroANS
                             };
                ListViewItem itemnf = new ListViewItem();

                if (operadoraPrestador.GetById(AddinUtils.UsuarioID) != null)
                {
                    foreach (var opNaoFiliadas in query2)
                    {
                            itemnf = new ListViewItem(operadora.GetById(opNaoFiliadas.RegistroANS).Nome);
                            itemnf.SubItems.Add(opNaoFiliadas.RegistroANS);
                            itemnf.SubItems.Add(""); // codigo na operadora
                            itemnf.SubItems.Add(opPrestadorEntity.ID.ToString());

                            groupOpNaoFiliadas.Items.Add(itemnf);
                            lvwConfOperadoras.Items.Add(itemnf);
                    }
                }

                else
                {
                    foreach (var opNaoFiliadas in query2)
                    {
                         itemnf = new ListViewItem(operadora.GetById(opNaoFiliadas.RegistroANS).Nome);
                        itemnf.SubItems.Add(opNaoFiliadas.RegistroANS);
                        itemnf.SubItems.Add(""); // codigo na operadora
                        itemnf.SubItems.Add(opPrestadorEntity.ID.ToString());
                        groupOpNaoFiliadas.Items.Add(itemnf);
                        lvwConfOperadoras.Items.Add(itemnf);
                    }
                }
           
            updateConf = true;
            gpbIntervaloLote.Enabled = false;
            txtCodOp.Text = "";
            txtLoteMax.Text = "";
            txtLoteMin.Text = "";
            gpbCodigo.Enabled = true;
            rbCPFCNPJ.Checked = true;
            dgvIntervaloLote.DataSource = null;
            btnConfGravar.Enabled = false;
        }

        /// <summary>
        /// Carrega o Intervalo de Lotes na Prestadora do Prestador Selecionados na guia Configurações
        /// </summary>
        private void carregaIntervaloLote()
        {
            int idIntervaloLote = Convert.ToInt32(lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[3].Text);
            var query2 = from op in operadoraPrestador.GetAll()
                         from il in intervaloLote.GetAll()
                         where op.IDPrestador == AddinUtils.UsuarioID && il.IDOperadoraPrestador == idIntervaloLote && il.IDOperadoraPrestador == op.ID
                         select new
                         {
                             il.ID,
                             il.Atual,
                             il.Inicio,
                             il.Fim
                         };
            
            dgvIntervaloLote.Rows.Clear();
            foreach (var intervalo in query2)
            {
                dgvIntervaloLote.Rows.Add(intervalo.ID, intervalo.Inicio, intervalo.Fim, intervalo.Atual);
            }

            if (query2.Count() > 0)
            {
                dgvIntervaloLote.Columns[0].Visible = false;
                dgvIntervaloLote.Columns[1].Width = 60;
                dgvIntervaloLote.Columns[2].Width = 60;
                dgvIntervaloLote.Columns[3].Width = 60;
            }
           
        }
        #endregion

        #region Eventos Configurações

       private void lvwConfOperadoras_SelectedIndexChanged(object sender, EventArgs e)
        {
           
            dgvIntervaloLote.Rows.Clear();

            if (lvwConfOperadoras.SelectedIndices.Count > 0)
            {
                if (lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].Group.Header == "Operadoras Filiadas")
                {
                    btnRemoverOp.Enabled = true;
                    btnConfGravar.Enabled = true;
                    if (updateConf)
                        //Verifica se tem algum item selecionado no ListView de Operadoras
                        if (lvwConfOperadoras.SelectedItems.Count > 0)
                        {
                            //Verifica se o código é por CPF/CNPJ ou CódigoNaOperadora
                            if (lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[2].Text == "")
                            {
                                rbCPFCNPJ.Checked = true;
                            }
                            else
                            {
                                rbCodOp.Checked = true;
                                txtCodOp.Text = lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[2].Text;
                            }

                            carregaIntervaloLote();
                            gpbIntervaloLote.Enabled = true;
                            gpbCodigo.Enabled = true;
                        }
                }
                else
                {
                    if (MessageBox.Show("Deseja se filiar a esta Operadora?",
                                  "Mensagem", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        opPrestadorEntity.RegistroANS = lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[1].Text;
                        opPrestadorEntity.IDPrestador = AddinUtils.UsuarioID;



                        if (rbCPFCNPJ.Checked == true)
                            opPrestadorEntity.CodigoNaOperadora = "";
                        else
                            opPrestadorEntity.CodigoNaOperadora = txtCodOp.Text;

                        lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[2].Text = operadoraPrestador.Insert(opPrestadorEntity).ToString();
                        btnConfGravar.Enabled = false;
                        carregaOperadorasFiliadas();
                        btnRemoverOp.Enabled = false;
                    }
                }
            }
        }

        /// <summary>
        /// Remove Operadora filiada
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRemoveOp_Click(object sender, EventArgs e)
        {
            //Mensagem de verificação de Exclusão
            
            if(MessageBox.Show("Deseja remover esta Operadora Filiada?",
                "Mensagem", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                opPrestadorEntity.ID = Convert.ToInt32(lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[3].Text);
                operadoraPrestador.Delete(opPrestadorEntity);
                carregaOperadorasFiliadas();
                btnRemoverOp.Enabled = false;
                dgvIntervaloLote.Rows.Clear();
            }
        }

       private void btnLoginConf_Click(object sender, EventArgs e)
        {
            Globals.ThisAddIn.LoginCTP = Globals.ThisAddIn.CustomTaskPanes.Add(new uc_Login(this), "Login para Configurações");
            Globals.ThisAddIn.LoginCTP.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
            Globals.ThisAddIn.LoginCTP.Width = 125;
            Globals.ThisAddIn.LoginCTP.Height = 155;
            Globals.ThisAddIn.LoginCTP.Visible = true;
            Globals.ThisAddIn.LoginCTP.Control.Focus();          
        }

       private void btnConfGravar_Click(object sender, EventArgs e)
       {
           if (lvwConfOperadoras.SelectedIndices.Count > 0)
           {
               opPrestadorEntity.RegistroANS = lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[1].Text;
               opPrestadorEntity.IDPrestador = AddinUtils.UsuarioID;
               opPrestadorEntity.ID = Convert.ToInt32(lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[3].Text);

               if (rbCPFCNPJ.Checked == true)
                   opPrestadorEntity.CodigoNaOperadora = "";
               else
                   opPrestadorEntity.CodigoNaOperadora = txtCodOp.Text;
               operadoraPrestador.Update(opPrestadorEntity);
               txtCodOp.Text = opPrestadorEntity.CodigoNaOperadora;
          //     carregaOperadorasFiliadas();
           }
           else
               MessageBox.Show("Selecione uma Operadora!");
              
        }

       private void btnAddIntervalo_Click(object sender, EventArgs e)
       {
           if (lvwConfOperadoras.SelectedIndices.Count > 0)
           {
               if (txtLoteMax.Text != "" && txtLoteMin.Text != "")
               {
                   if (Convert.ToInt64(txtLoteMin.Text) < Convert.ToInt64(txtLoteMax.Text))
                   {
                       intervaloLoteEntity.IDOperadoraPrestador = Convert.ToInt32(lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[3].Text);
                       intervaloLoteEntity.Atual = Convert.ToInt32(txtLoteMin.Text);
                       intervaloLoteEntity.Inicio = Convert.ToInt32(txtLoteMin.Text);
                       intervaloLoteEntity.Fim = Convert.ToInt32(txtLoteMax.Text);
                       intervaloLote.Insert(intervaloLoteEntity);
                       txtLoteMin.Text = "";
                       txtLoteMax.Text = "";
                       dgvIntervaloLote.Rows.Add(intervaloLoteEntity.IDOperadoraPrestador, intervaloLoteEntity.Inicio, intervaloLoteEntity.Fim, intervaloLoteEntity.Atual);
                   }
                   else
                       MessageBox.Show("Intervalo Inválido!");
               }
               else
                   MessageBox.Show("Preencha o intervalo corretamente!");
           }
       }

  /*     private void btnConfGravar_Click(object sender, EventArgs e)
       {
           //Verifica se tem alguma operadora selecionada no ListView
           if (lvwConfOperadoras.SelectedIndices.Count > 0)
               //Verifica se algum tipo de Código esta selecionado
               if (rbCodOp.Checked != false || rbCPFCNPJ.Checked != false)
               {
                   opPrestadorEntity.RegistroANS = lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[1].Text;
                   opPrestadorEntity.IDPrestador = AddinUtils.UsuarioID;
                   opPrestadorEntity.CodigoNaOperadora = txtCodOp.Text;
                   operadoraPrestador.Insert(opPrestadorEntity);
               }
               else
                   MessageBox.Show("Selecione um tipo de Código para trabalhar com esta Operadora!");
           else
               MessageBox.Show("Selecione uma Operadora!");
       }*/

       private void dgvIntervaloLote_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
       {
           intervaloLoteEntity.ID = Convert.ToInt32(dgvIntervaloLote.Rows[e.Row.Index].Cells["ID"].Value);
           intervaloLote.Delete(intervaloLoteEntity);
       }

       private void dgvIntervaloLote_CellEndEdit(object sender, DataGridViewCellEventArgs e)
       {
           intervaloLoteEntity.ID = Convert.ToInt32(dgvIntervaloLote.Rows[e.RowIndex].Cells["ID"].Value);
           intervaloLoteEntity.IDOperadoraPrestador = Convert.ToInt32(lvwConfOperadoras.Items[lvwConfOperadoras.SelectedIndices[0]].SubItems[3].Text);
           intervaloLoteEntity.Inicio = Convert.ToInt32(dgvIntervaloLote.Rows[e.RowIndex].Cells["Inicio"].Value);
           intervaloLoteEntity.Fim = Convert.ToInt32(dgvIntervaloLote.Rows[e.RowIndex].Cells["Fim"].Value);
           intervaloLoteEntity.Atual = Convert.ToInt32(dgvIntervaloLote.Rows[e.RowIndex].Cells["Atual"].Value);
           intervaloLote.Update(intervaloLoteEntity);
       }

       private void rbCodOp_CheckedChanged(object sender, EventArgs e)
       {
           if (rbCodOp.Checked)
               txtCodOp.Enabled = true;
           else
           {
               txtCodOp.Enabled = false;
               txtCodOp.Text = "";
           }

       }

        #endregion
    }
}

  

